package modele;

import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Observable;
/**
 * gere la validite des champs de saisies ma, gere l'ajout/modif d'une bd dans la bdteque 
 * @author tomu
 *
 */
public class ModeleMA extends Observable{
	private CollectionBD collec;
	private Album album;
	private ModeleP modele;
	private String titre="", editeur="",genres="",resume="";
	private String note="",annee="";
	private String urlImage="";
	private String auteurs="",dessinateurs="";
	/**
	 * 
	 * @param collec la collection de bd dans son integralite
	 * @param album l'album selecionne (null si aucun selectionne)
	 * @param modele le modelePrincipal afin de lui avertir de la fin de l'ajout
	 */
	public ModeleMA(CollectionBD collec,Album album,ModeleP modele){
		this.collec=collec;
		this.album=album;
		if(album!=null){
			this.titre=album.getTitre();
			this.editeur=album.getEditeur();
			this.genres=(""+album.getGenres()).substring(1,(""+album.getGenres()).length()-1);
			this.dessinateurs=(""+album.getDessinateurs()).substring(1,(""+album.getDessinateurs()).length()-1);
			this.auteurs=(""+album.getAuteurs()).substring(1,(""+album.getAuteurs()).length()-1);
			this.note=""+album.getNote();
			this.annee=""+album.getAnnee();
			this.urlImage=""+album.getImage();
		}
		this.modele=modele;
	}
	/**
	 * permet a la vue de tester la validite de ce qu'as ecris l'utilisateur dans le champ note
	 * @return 0 si le champ est encore vide
	 * @return 1 si le champ est bien rempli
	 * @return -1 si le chiffre est trop grnbad ou trop petit
	 * @return -2 si il ne s'agit pas de chiffre
	 */
	public int valideNote() {
		if(note.isEmpty())return 0;
		try{
			if(Integer.parseInt(note)>20||Integer.parseInt(note)<0)return -1;
		}catch(NumberFormatException e){
			return -2;
		}
		return 1;
	}
	/**
	 * permet a la vue de tester la validite de ce qu'as ecris l'utilisateur dans le champ annee
	 * @return 0 si le champ est encore vide
	 * @return 1 si le champ est bien rempli
	 * @return -1 si le chiffre est trop grnbad ou trop petit
	 * @return -2 si il ne s'agit pas de chiffre
	 */
	public int valideAnnee() {
		if(annee.isEmpty())return 0;
		try{
			if(Integer.parseInt(annee)<1900||Integer.parseInt(annee)> Calendar.getInstance().get(Calendar.YEAR))return -1;
		}catch(NumberFormatException e){
			return -1;
		}
		return 1;
	}
	/**
	 * permet a la vue de tester la validite de ce qu'as ecris l'utilisateur dans le champ titre
	 * @return 0 si le champ est encore vide
	 * @return 1 si le champ est bien rempli
	 * @return -1 si le champ contient des charactere illegaux
	 * @return -2 si le titre est deja present
	 */
	public int valideTitre() {
		if(titre.isEmpty())return 0;
		if(!titre.matches("[\\w\\-\\s'()\\-!:,;?\\.]+"))return -1;
		if(album==null&&collec.exist(titre)||album!=null&&(!titre.equals(album.getTitre())&&collec.exist(titre)))return -2;
		else return 1;
	}
	/**
	 * permet a la vue de tester la validite de ce qu'as ecris l'utilisateur dans le champ editeur
	 * @return 0 si le champ est encore vide
	 * @return 1 si le champ est bien rempli
	 * @return -1 si le champ contient des charactere illegaux
	 */
	public int valideEditeur() {
		if(editeur.isEmpty())return 0;
		if(!editeur.matches("[\\w\\-:\\s']+"))return -1;
		else return 1;
	}
	/**
	 * permet a la vue de tester la validite de ce qu'as ecris l'utilisateur dans le champ resume
	 * @return 0 si le champ est encore vide
	 * @return 1 si le champ est bien rempli
	 * @return -1 si le champ contient des charactere illegaux
	 */
	public int valideResume() {
		if(resume.isEmpty())return 0;
		if(!resume.matches("([\\w\\-\\s',()\\-!?\\.])+"))return -1;
		else return 1;
	}
	/**
	 * permet a la vue de tester la validite de ce qu'as ecris l'utilisateur dans le champ url
	 * @return 0 si le champ est encore vide
	 * @return 1 si le champ est bien rempli
	 * @return -1 si le champ contient des charactere illegaux
	 */
	public int valideURL(){
		if(urlImage.isEmpty())return 0;
		return 1;
	}
	/**
	 * permet a la vue de tester la validite de ce qu'as ecris l'utilisateur dans le champ auteur
	 * @return 0 si le champ est encore vide
	 * @return 1 si le champ est bien rempli
	 * @return -1 si le champ contient des charactere illegaux ou n'est pas de la bonne forme
	 */
	public int valideAuteur() {
		if(auteurs.isEmpty())return 0;
		if(!auteurs.matches("[\\w\\-\\s']+(,[\\w\\-\\s']+)*;?"))return -1;
		else return 1;
	}
	/**
	 * permet a la vue de tester la validite de ce qu'as ecris l'utilisateur dans le champ dessinateur
	 * @return 0 si le champ est encore vide
	 * @return 1 si le champ est bien rempli
	 * @return -1 si le champ contient des charactere illegaux ou n'est pas de la bonne forme
	 */
	public int valideDessinateurs() {
		if(dessinateurs.isEmpty())return 0;
		if(!dessinateurs.matches("[\\w\\-\\s']+(,[\\w\\-\\s']+)*;?"))return -1;
		else return 1;
	}
	/**
	 * permet a la vue de tester la validite de ce qu'as ecris l'utilisateur dans le champ genres
	 * @return 0 si le champ est encore vide
	 * @return 1 si le champ est bien rempli
	 * @return -1 si le champ contient des charactere illegaux ou n'est pas de la bonne forme
	 */
	public int valideGenres() {
		if(genres.isEmpty())return 0;
		if(!genres.matches("[A-Z]?[a-z\\s]*(,\\s*[A-Z]?[a-z\\s]*)*[,;]?\\s*"))return -1;
		else return 1;
	}
	/**
	 * 
	 * @return vrai si tous les champs sont valides
	 */
	public boolean valide(){
		return(valideTitre()+valideAuteur()+valideDessinateurs()+valideEditeur()+valideGenres()+valideNote()+valideResume()+valideAnnee()==8);
	}
	/**
	 * ajoute ou modifie l'abum puis signale a la vue la fin de l'operation
	 */
	public void valider(){
		if(valide()){
			try{
				if(this.album!=null)collec.supprimer(album);
				ArrayList<String>genres,auteurs,dessinateurs;
				genres=new ArrayList<String>();
				String[] genre=this.genres.split(",");
				for(String s:genre)genres.add(s.trim());
				auteurs=new ArrayList<String>();
				String[] auteur=this.auteurs.split(",");
				for(String s:auteur)auteurs.add(s.trim());
				dessinateurs=new ArrayList<String>();
				String[] dessinateur=this.dessinateurs.split(",");
				for(String s:dessinateur)dessinateurs.add(s.trim());
				int note=Integer.parseInt(this.note);
				int annee=Integer.parseInt(this.annee);
				collec.add(new Album(titre, editeur, genres, auteurs, note, resume, dessinateurs, annee, urlImage));
				modele.amFinit();
			}catch(NumberFormatException e){

			}
		}

	}
	/**
	 * annule l'operation am
	 */
	public void quitterAjout(){
		modele.amFinit();
	}
	public void setTitre(String titre) {
		this.titre=titre;
		setChanged();notifyObservers();
	}
	public void setEditeur(String editeur) {
		this.editeur=editeur;
		setChanged();notifyObservers();
	}
	public void setGenres(String genres) {
		this.genres=genres;
		setChanged();notifyObservers();
	}
	public void setResume(String resume) {
		this.resume=resume;
		setChanged();notifyObservers();
	}
	public void setNote(String note) {
		this.note=note;
		setChanged();notifyObservers();
	}
	public void setAnnee(String annee) {
		this.annee=annee;
		setChanged();notifyObservers();
	}
	public void setURL(String url) {
		this.urlImage=url;
		setChanged();notifyObservers();
	}
	public void setAuteurs(String auteurs) {
		this.auteurs=auteurs;
		setChanged();notifyObservers();
	}
	public void setDessinateurs(String dessinateurs) {
		this.dessinateurs=dessinateurs;
		setChanged();notifyObservers();
	}
	public Album getAlbum(){
		return album;
	}
}
